/**
 * @author phi
 */

(function(){ "use strict"; })();

/*
 * Attribute
 */
TM.loadScript("dom", "dom", function(){
    var Element = TM.DOM.Element;
    
    /**
     * 属性を管理するクラス
     * @lends   TM.DOM.Attribute.prototype
     * @memo    element.attributes(NamedNodeMap) ってやつがある.
     *          attributes は getNamedItem というメソッドをもっていて
     *          属性名を指定すると Attr というオブジェクトを返す.
     */
    var Attribute = TM.DOM.Attribute = TM.createClass({
        
        element: null,
        
        /**
         * @constructs
         * @see <a href="./../../test/dom/attribute-test.html">Test Program</a>.
         */
        init: function(element) {
            this.element = element;
        },
        
        /**
         * 属性をセット
         */
        set: function(name, value) {
            this.element.setAttribute(name, value);
            return this;
        },
        
        /**
         * 属性を追加
         */
        add: function(name, value) {
            var now = this.get(name);
            value = (now) ? now + ' ' + value : value;
            this.element.setAttribute(name, value);
            return this;
        },
        
        /**
         * 属性を削除
         */
        remove: function(name) {
            this.element.removeAttribute(name);
            return this;
        },
        
        /**
         * 属性を取得
         */
        get: function(name) {
            return this.element.getAttribute(name);
        },
        
    });
    
    /**
     * 
     * @scope   TM.DOM.AttrList.prototype
     */
    var AttrList = TM.DOM.AttrList = TM.createClass({
        superClass: Array,
        
        /**
         * 属性管理リストクラス.
         * @constructs
         */
        init: function(arr) {
            if (arr == undefined) return ;
            
            for (var i=0,len=arr.length; i<len; ++i) {
                this.push(arr[i]);
            }
        },
        
        /**
         * 属性をセット
         */
        set     : Attribute.prototype.set.toArrayFunction(),
        /**
         * 属性を追加
         */
        add     : Attribute.prototype.add.toArrayFunction(),
        /**
         * 属性を削除
         */
        remove  : Attribute.prototype.remove.toArrayFunction(),
        /**
         * 属性を取得
         */
        get     : Attribute.prototype.get.toArrayFunction(),
    });
    
    
    
    /**
     * 属性管理クラス
     * @name    attr
     * @fieldof TM.DOM.Element.prototype
     * @type    TM.DOM.Attribute
     */
    Element.prototype.getter("attr", function(){
        return this._attr || ( this._attr = Attribute(this.element) );
    });
    
    /**
     * 属性管理クラス
     * @name    attr
     * @fieldof TM.DOM.ElementList.prototype
     * @type    TM.DOM.AttrList
     */
    TM.DOM.ElementList.prototype.getter("attr", function(){
        return this._attr || ( this._attr = AttrList(this) );
    });
    
    console.assert(!TM.$DOMAttr, "名前が競合しています!!", "$DOMAttr");
    /**
     * TM.DOM.Attribute の alias.
     * short hand としてお使いください.
     */
    TM.$DOMAttr = TM.DOM.Attribute;
    
    
});

